#ifndef GY_TABLEVIEWITEMDELEGATE_H
#define GY_TABLEVIEWITEMDELEGATE_H

#include <QObject>
#include <QTableView>
#include <QStandardItemModel>
#include <QStyledItemDelegate>

#include "../DelegateWidget/GY_BaseDelegateWidget.h"

class GY_DelegateTableView;

class GY_TableViewItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT

signals:
    void dataChanged(const QVariant &data,const QVariant& rowId,int column) const;

public:
    ///
    /// \brief GY_TableViewItemDelegate 代理类构造
    /// \param parent 代理的表格视图
    ///
    explicit GY_TableViewItemDelegate(GY_DelegateTableView* parent);

    typedef GY_BaseDelegateWidget* (*Constructor)(QWidget* parent);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

    void setEditorData(QWidget *editor, const QModelIndex &index) const override;

    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;

    ///
    /// \brief registerDelegate 注册代理控件
    /// \param delegateType 标识符
    /// \return 是否注册成功
    ///
    template<class T>
    bool registerDelegate(QVariant delegateType)
    {
        //判断T的类型是否符合要求

        //注册控件插入map
        m_RegisterMap.insert(delegateType,&constructorHelper<T>);
        return true;
    }
    ///
    /// \brief setDelegate 设置哪个item的标识符（标明代理控件）
    /// \param row 行
    /// \param column 列
    /// \param delegateType 标识符
    /// \return 是否设置成功
    ///
    bool setDelegate(const QVariant& rowId,int column,QVariant delegateType) {
        if(m_DelegateTypeMap.contains(rowId)) {
            m_DelegateTypeMap[rowId].insert(column,delegateType);
        }else {
            QMap<int,QVariant> map;
            map.insert(column,delegateType);
            m_DelegateTypeMap.insert(rowId,map);
        }

        return true;
    }
    ///
    /// \brief newInstance 根据标识符获取注册的控件
    /// \param delegateType 标识符
    /// \param parent 父类
    /// \return 注册控件
    ///
    GY_BaseDelegateWidget* newInstance(const QVariant& delegateType,QWidget* parent = nullptr) const
    {
        Constructor constructor = m_RegisterMap.value(delegateType);
        if(constructor == nullptr)
        {
            return nullptr;
        }
        return (*constructor)(parent);
    }

public slots:

    void clickedBlack(QStandardItemModel *model);

private:
    ///
    /// \brief constructorHelper 创建控件函数
    /// \param parent 父类
    /// \return 控件
    ///
    template<class T>
    static GY_BaseDelegateWidget* constructorHelper(QWidget *parent) {
        return new T(parent);
    }

private:
    ///
    /// \brief m_TableView 表格视图
    ///
    GY_DelegateTableView* m_pTableView = nullptr;
    ///
    /// \brief m_RegisterMap 标识符和创建控件函数指针映射关系
    ///
    QMap<QVariant,Constructor> m_RegisterMap;
    ///
    /// \brief m_DelegateTypeMap 某行某列代理标识符
    ///
    QMap<QVariant,QMap<int,QVariant>> m_DelegateTypeMap;
    ///
    /// \brief m_Editor 编辑器窗口
    ///
    mutable QWidget* m_Editor = nullptr;
    ///
    /// \brief m_Index 索引
    ///
    mutable QModelIndex m_Index = QModelIndex();

};

#endif // GY_TABLEVIEWITEMDELEGATE_H
